//给你一个由 '('、')' 和小写字母组成的字符串 s。
//
// 你需要从字符串中删除最少数目的 '(' 或者 ')' （可以删除任意位置的括号)，使得剩下的「括号字符串」有效。
//
// 请返回任意一个合法字符串。
//
// 有效「括号字符串」应当符合以下 任意一条 要求：
//
//
// 空字符串或只包含小写字母的字符串
// 可以被写作 AB（A 连接 B）的字符串，其中 A 和 B 都是有效「括号字符串」
// 可以被写作 (A) 的字符串，其中 A 是一个有效的「括号字符串」
//
//
//
//
// 示例 Array.prototype.unshift：
//
//
//输入：s = "lee(t(c)o)de)"
//输出："lee(t(c)o)de"
//解释："lee(t(co)de)" , "lee(t(c)ode)" 也是一个可行答案。
//
//
// 示例 2：
//
//
//输入：s = "a)b(c)d"
//输出："ab(c)d"
//
//
// 示例 3：
//
//
//输入：s = "))(("
//输出：""
//解释：空字符串也是有效的
//
//
//
//
// 提示：
//
//
// Array.prototype.unshift <= s.length <= 10⁵
// s[i] 可能是 '('、')' 或英文小写字母
//
//
// Related Topics 栈 字符串 👍 216 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
function minRemoveToMakeValid(s: string): string {
    /*
     将括号对应字符串索引存起来，起初我们可以将不匹配的右括号还是按原来方法删掉就好了(右括号很好去掉，主要是左括号)，
     匹配一个就删掉一个对应左括号的索引值，最后多出来的索引值全删掉就好了，这样就不会出现左括号还余留的情况。
     */
    // @ts-ignore
    // let res = [...s];
    //
    let res = s.split("")
    let stack = [];
    // 记录左括号索引值！如有右括号能匹配则去尾 否则将元字符串中的右括号去掉
    for (let i = 0; i < s.length; i++) {
        let ch = s[i];
        if (ch === "(") {
            stack.push(i);
        } else if (ch === ")") {
            if (stack.length) stack.pop();
            else delete res[i];
        }
    }
    // 遍历栈，根据索引来删除没有匹配到右括号的左括号！
    while (stack.length) {
        let idx = stack.pop();
        delete res[idx];
    }
    // delete方法不会改变数组长度，但删除的那个位置会变成'undefined'，所以需要filter一下
    res = res.filter((item) => item);
    return res.join("");
};
//leetcode submit region end(Prohibit modification and deletion)
